package QianFeng03;

/**构造方法
 * 构造方法就是类构造对象时调用的方法，用于对象的初始化工作
 * 构造方法是实例化一个类的对象时，也就是new的时候，最先调用的方法
 * 构造方法时在类中定义的，构造方法的定义格式：方法名称与类名称相同，无返回值类型的声明
 * 对象实例化方法：Dog dog = new Dog(); //new Dog后面有个括号，表示调用了方法，此时调用的方法就是构造方法
 * 每个类中都会有一个默认的无参的构造方法
 * 如果类中有显示的构造方法，那么默认构造方法将无效
 * 如果有显示的构造方法，还想保留默认构造方发，需要显示的写出来
 * 构造方发可以有多个，但参数不一样，称为构造方发的重载
 * 在构造方法中调用另一个构造方法，使用this(...)，该句代码必须放在第一句
 * 构造方法的调用，必须要有出口
 * 给对象初始化数据可以使用构造方法或setter方法，通常情况下，两者都会保留
 * 一个好的编程习惯是要保留默认的构造方法，（为了方便一些框架代码使用反射来创建对象）
 * private Dog(){}，构造方法私有化，当我们的需求是为了保证该类只有一个对象时
 * 什么时候一个类只需要一个对象？比如，工具类（没有属性的类，只有行为）并且该工具对象被频繁使用。
 * 权衡只用一个对象与产生多个对象的内存使用，来确定该类是否要定义为只需要一个对象
 */
public class Test3 {

    public static void main(String[] args) {
        Dog dog = new Dog();
        Dog dog1 = new Dog("wangwang",5);

    }

}

class Dog{
    /*构造方法的重载*/
    //无参数构造方法，默认构造方法。通常有其他构造方法时，保留默认构造方法
    public Dog() {
        System.out.println("构造方法执行了！");
    }
    //带一个参数的构造方法
    public Dog(String name){
        this.name = name;
        System.out.println("带一个参数的构造方法执行了!");
    }
    //带两个参数的构造方法
    public Dog(String name, int age){
        this(name);//调用其他构造方法时，此语句需要放置在第一句，在构造方法相互调用时必须要有出口
        //this.name = name;
        this.age = age;
        System.out.println("带两个参数的构造方法执行了!");
    }

    private String name;
    private int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
